PWM(Pulse Width Modulation 脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它是一种对模拟信号电平进行数字编码的方法。是指在一定时间内波形的高电平(即 1 状态)所占用的时间比例。通过高分辨率计数器的使用,方波占空比被调制用来对一个模拟信号的电平进行编码。PWM 信号任然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有,要么完全无。比如我们的电压输出是 5V的,那么经过改变 PWM 的占空比,可以达到在一定时间内输出 3.3V 或者 1.3V 的效果。举个例子 想象你有一个LED和一个开关,你以肉眼看不清的速度,快速反复地开关一次,这样LED灯就会亮一半时间,暗一半时间。如果你快速地进行这个操作,对于观察者来说,LED就像是以半亮度持续亮着。这就是PWM的基本原理。 如果你把大部分时间保持开关为关闭状态,那么LED会显得更暗;相反,如果你把开关大部分时间保持为打开状态,LED会显得更亮。这就是PWM调节占空比来控制亮度的过程。
8.2 PWM的基本参数 PWM 是脉冲宽度调制,具有两个非常重要的参数:频率和占空比。
频率:PWM 信号的周期长度,通常使用赫兹 (Hz) 表示,表示每秒钟有多少个脉冲。PWM 的频率是整个周期的倒数。指 1 秒钟内信号从高电平到低电平再回到高电平的次数(一个周期)占空比:占空比是指一个周期内高电平所占的比例。分辨率:ESP32 支持的 PWM 信号分辨率是指设备可输出的不同占空比级别的数量。例如,8 位分辨率就表示设备可以输出 2^8 个不同占空比级别,即 0%、1/256、2/256 … 直到 100%。8.3 ESP32S3上的PWM 在ESP32-S3中有两个硬件外设可以输出PWM信号,分别是LED PWM 控制器 (LEDC) 和 电机控制脉宽调制器 (MCPWM)。它们各有其特点和用途:
LED PWM 控制器 (LEDC):这个模块的主要设计目标是产生高精度的 PWM 波形,用以控制 LED 灯的亮度或者产生声音。LEDC 的分辨率可以达到 16 位,能够产生准确且平滑的变化,适用于控制 LED 灯的亮度和产生声音。并且,LEDC 支持多达 8 个通道的 PWM 输出,且支持任意的GPIO引脚。用户可以配置每个通道的频率和占空比。电机控制脉宽调制器 (MCPWM):这个模块主要用于马达控制,包括伺服马达、步进马达和普通电机。MCPWM 支持更加复杂的控制模式,如电机的向前/向后驱动、断电刹车等,并且支持闭环控制模式,能满足更复杂的电机控制需求。MCPWM 支持高达 6 个通道的独立 PWM 输出,并且支持死区控制和外部信号捕获。 总的来说,它们两者在处理 PWM 方面有所不同,并被应用于不同的场景。LEDC 更加适合控制灯光、声音等线性设备,而 MCPWM 包含更高级的功能,适合电机控制。本章我们以LED PWM 控制器作为案例输出PWM,后面简称LEDC。8.4 PWM的操作流程 定时器配置:指定 PWM 信号的频率和占空比分辨率。通道配置: 绑定定时器和输出 PWM 信号的 GPIO。改变PWM信号:输出 PWM 信号来驱动 LED。可通过软件控制或使用硬件渐变功能来改变 LED 的亮度。8.4.1 定时器配置 要设置定时器,可调用函数 ledc_timer_config(),并将包括如下配置参数的数据结构ledc_timer_config_t 传递给该函数。关于ledc_timer_config_t 的相关参数说明:
speed_mode :速度模式。注意,与 ESP32 不同,ESP32-S3 仅支持设置通道为低速模式,即LEDC_LOW_SPEED_MODE。timer_num : 通道的定时器源。定时器索引 ledc_timer_t。可选参数如下: LEDC_TIMER_0LEDC_TIMER_1LEDC_TIMER_2LEDC_TIMER_3LEDC_TIMER_MAXfreq_hz : PWM 信号频率,表示LEDC模块的定时器时钟频率设置,单位为Hz。duty_resolution : PWM 占空比分辨率。占空比分辨率通常用ledc_timer_bit_t设置,范围是 10 至 15 位。如需较低的占空比分辨率(上至 10,下至 1),可直接输入相应数值。相关参数请参考 ledc_timer_bit_t。clk_cfg: LEDPWM的时钟来源。可选以下参数: LEDC_AUTO_CLK:启动定时器时,将根据给定的分辨率和占空率参数自动选择ledc源时钟; LEDC_USE_APB_CLK:选择APB作为源时钟; LEDC_USE_RC_FAST_CLK:选择“RC_FAST”作为源时钟; LEDC_USE_XTAL_CLK:选择XTAL作为源时钟; LEDC_USE_RTC8M_CLK:”LEDC_USE_RC_FAST_CLK” 的别名;频率和占空比分辨率相互关联。PWM 频率越高,占空比分辨率越低,反之亦然。如果 API 不是用来改变 LED 亮度,而是用于其它目的,这种相互关系可能会很重要。